package types

import (
	"xincan.com.cn/tarot-go/internal/common/constants"
)

// Service
// Title 				Service
// Description 			全局参数配置(映射配置文件)
// Author  				alittlexincan@163.com 					2024/07/22 11:36
// Update  				alittlexincan@163.com 					2024/07/22 11:36
type Service struct {

	// Config 服务配置
	Config *Application `mapstructure:"application" json:"application"`

	// Other 配置项
	OtherConfig map[string]interface{} `mapstructure:",remain" json:"other"`
}

// Application
// Title 			Application
// Description 		系统配置信息
// Author  			alittlexincan@163.com 				2024/07/22 11:36
// Update  			alittlexincan@163.com 				2024/07/22 11:36
type Application struct {

	// Version 系统版本
	Version string `mapstructure:"version" json:"version"`

	// Active 配置文件激活: 则当前值为初始化系统配置, (支持: dev, test), 默认: 初始化系统配置,不带后缀
	Active string `mapstructure:"active" json:"active"`

	// NAME 服务名称
	Name string `mapstructure:"name" json:"name"`

	// Ip 当前服务IP地址
	Ip string `mapstructure:"ip" json:"ip"`

	// Port 当前服务端口, 默认: 8080
	Port int `mapstructure:"port" json:"port"`

	// Node 服务编号, 必须唯一, 默认: 1
	Node int `mapstructure:"node" json:"node"`

	// Log 日志配置信息
	Log *Log `mapstructure:"log" json:"log"`

	// ConfigCenter 配置信息
	ConfigCenter *Config `mapstructure:"config" json:"config"`

	// Registry 注册中心配置信息
	RegistryCenter *Registry `mapstructure:"registry" json:"registry"`

	// CacheCenter 缓存配置信息
	CacheCenter *Cache `mapstructure:"cache" json:"cache"`

	// Database 数据库配置信息
	Database *Database `mapstructure:"database" json:"database"`
}

// Log
// Title 			Log 日志配置信息
// Author  			alittlexincan@163.com 				2024/07/22 11:36
// Update  			alittlexincan@163.com 				2024/07/22 11:36
type Log struct {

	// Enabled 是否开启日志存储, 默认: true
	Enabled bool `mapstructure:"enabled" json:"enabled"`

	// Path 日志存储: 日志存放地址, 默认: ./logs
	Path string `mapstructure:"path" json:"path"`

	// MaxBackups 日志文件最多保存多少个备份(单位: 个), 默认: 10
	MaxBackups int `mapstructure:"maxBackups" json:"maxBackups"`

	// MaxSize 日志文件在轮转前最大的大小(单位: MiB), 默认: 100MiB
	MaxSize int `mapstructure:"maxSize" json:"maxSize"`

	// MaxAge 基于文件名中编码的时间戳保留旧日志文件的最大天数。默认不根据时间删除旧日志文件。(单位: h), 默认168h
	MaxAge int `mapstructure:"maxAge" json:"maxAge"`

	// Compress 是否开启日志压缩: 使用gzip压缩已旋转的日志文件,默认: false
	Compress bool `mapstructure:"compress" json:"compress"`
}

// Config
// Title 			Config 加载系统配置信息
// Author  			alittlexincan@163.com 				2024/07/22 11:36
// Update  			alittlexincan@163.com 				2024/07/22 11:36
type Config struct {

	// Provider 配置中心类型: 默认[none], 支持: [none、nacos], none: 采用本地配置
	Provider constants.ProviderType `mapstructure:"provider" json:"provider"`

	// Watch 配置文件是否监听: 默认: true
	Watch bool `mapstructure:"watch" json:"watch"`

	// Center 动态配置 - 使用map存储不同配置中心的配置
	Center map[string]interface{} `mapstructure:",remain" json:"center"`
}

// Registry
// Title 			Registry 注册中心配置信息
// Author  			alittlexincan@163.com 				2024/07/22 11:36
// Update  			alittlexincan@163.com 				2024/07/22 11:36
type Registry struct {

	// Provider 注册中心类型: 默认[none], 支持: [none、nacos、consul], none: 不注册
	Provider constants.ProviderType `mapstructure:"provider" json:"provider"`

	// Center 动态配置 - 使用map存储不同注册中心的配置
	Center map[string]interface{} `mapstructure:",remain" json:"center"`
}

// Cache
// Title 			Cache 缓存配置信息
// Author  			alittlexincan@163.com 				2024/07/22 11:36
// Update  			alittlexincan@163.com 				2024/07/22 11:36
type Cache struct {

	// Provider 缓存类型: redis, memcached
	Provider constants.ProviderType `mapstructure:"provider" json:"provider"`

	// Center 缓存配置: redis
	Center map[string]interface{} `mapstructure:",remain" json:"center"`
}

// Database
// Title 			Database 数据库配置信息
// Author  			alittlexincan@163.com 				2024/07/22 11:36
// Update  			alittlexincan@163.com 				2024/07/22 11:36
type Database struct {

	// Provider 数据库类型: mysql, sqlite3, postgresql, oracle, sqlserver
	Provider constants.ProviderType `mapstructure:"provider" json:"provider"`

	// Orm 对象关系映射配置, (gorm、sqlx)
	Orm map[string]interface{} `mapstructure:"orm" json:"orm"`

	// MySQL 配置信息
	// SQL 动态配置 - 使用map存储不同配置中心的配置
	SQL map[string]interface{} `mapstructure:",remain" json:"sql"`
}
